package com.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * TODO knife4j 配置类
 *
 * @author Sakura
 * @date 2023/8/10 22:30
 */
@Configuration
@EnableSwagger2
@EnableWebMvc
public class Knife4jConfig implements WebMvcConfigurer {
    /**
     * 项目静态资源信息
     * @param registry:
     * @return void
     * @author Sakura
     * @date 2023/8/22 16:05
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
        registry.addResourceHandler("doc.html").addResourceLocations(
                "classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }


    @Bean
    public Docket systemApi() {
        // 创建一个 swagger 的 bean 实例
        return new Docket(DocumentationType.SWAGGER_2)
                // 配置基本信息
                .apiInfo(apiInfo("工具后端项目系统文档", "1.0"))
                .groupName("system")
                // 配置接口信息，设置扫描接口
                .select()

                /*
                 * RequestHandlerSelectors
                 *      .any() // 扫描全部的接口，默认
                 *      .none() // 全部不扫描
                 *      .basePackage("com.mike.server") // 扫描指定包下的接口，最为常用
                 *      .withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
                 *      .withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口
                 */

                // 此包路径下的类，才生成接口文档
                .apis(RequestHandlerSelectors.basePackage("com.cdtu.controller"))
                // 加了 RestController 注解的类，才生成接口文档
//                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                // 加了 ApiOperation 注解的方法，才生成接口文档
                //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))  // @ApiOperation：swagger 常用注解，用户标注方法描述

                /*
                 * PathSelectors
                 *      .any() // 满足条件的路径，该断言总为true
                 *      .none() // 不满足条件的路径，该断言总为false（可用于生成环境屏蔽 swagger）
                 *      .ant("/user/**") // 满足字符串表达式路径
                 *      .regex("") // 符合正则的路径
                 */

                .paths(PathSelectors.any())

                .build();
    }

    /**
     * 作者个人详细信息
     *
     * @param title:   捐赠管理系统-接口文档
     * @param version: 版本号
     * @return ApiInfo
     * @author Sakura
     * @date 2023/8/22 16:04
     */
    private ApiInfo apiInfo(String title, String version) {
        Contact contact = new Contact(
                "Sakura", // 作者姓名
                "作者网址:https://blog.csdn.net/weixin_61919057?type=blog", // 作者网址
                "1950622837@qq.com"); // 作者邮箱
        return new ApiInfoBuilder()
                .title(title)
                .description("巴山楚水凄凉地，二十三年弃置身")
                .license("knife4j-的使用(详细教程)")
                .licenseUrl("https://blog.csdn.net/xhmico/article/details/131701790")
                .termsOfServiceUrl("https://blog.csdn.net/xhmico/article/details/131701790")
                .contact(contact)
                .version(version)
                .build();
    }
}
